/*
 * 日志库接口设计
 *
 *
 *
 **/

#pragma once

#include "logger.hpp"

namespace easylog
{

inline void add(const logger::ptr& logger)
{
    registry::instance().add(logger);
}
inline logger::ptr get(const std::string& name)
{
    return registry::instance().get(name);
}
inline logger::ptr default_logger()
{
    return registry::instance().default_logger();
}

template<typename... Args>
inline void debug(logger::fmt_str_t fmt, Args&&... args)
{
    default_logger()->debug(fmt, std::forward<Args>(args)...);
}
template<typename... Args>
inline void info (logger::fmt_str_t fmt, Args&&... args)
{
    default_logger()->info (fmt, std::forward<Args>(args)...);
}
template<typename... Args>
inline void warn (logger::fmt_str_t fmt, Args&&... args)
{
    default_logger()->warn (fmt, std::forward<Args>(args)...);
}
template<typename... Args>
inline void error(logger::fmt_str_t fmt, Args&&... args)
{
    default_logger()->error(fmt, std::forward<Args>(args)...);
}
template<typename... Args>
inline void fatal(logger::fmt_str_t fmt, Args&&... args)
{
    default_logger()->fatal(fmt, std::forward<Args>(args)...);
}

inline void flush()
{
    default_logger()->flush();
}

#define EASYLOG_DEBUG(fmt, ...) easylog::debug(fmt, ##__VA_ARGS__)
#define EASYLOG_INFO( fmt, ...) easylog::info (fmt, ##__VA_ARGS__)
#define EASYLOG_WARN( fmt, ...) easylog::warn (fmt, ##__VA_ARGS__)
#define EASYLOG_ERROR(fmt, ...) easylog::error(fmt, ##__VA_ARGS__)
#define EASYLOG_FATAL(fmt, ...) easylog::fatal(fmt, ##__VA_ARGS__)

#define EASYLOG_LOGGER_DEBUG(lgr, fmt, ...) lgr->debug(fmt, ##__VA_ARGS__)
#define EASYLOG_LOGGER_INFO( lgr, fmt, ...) lgr->info (fmt, ##__VA_ARGS__)
#define EASYLOG_LOGGER_WARN( lgr, fmt, ...) lgr->warn (fmt, ##__VA_ARGS__)
#define EASYLOG_LOGGER_ERROR(lgr, fmt, ...) lgr->error(fmt, ##__VA_ARGS__)
#define EASYLOG_LOGGER_FATAL(lgr, fmt, ...) lgr->fatal(fmt, ##__VA_ARGS__)

using level_enum = level::lv_enum;
using color_enum = util::color::color_enum;
using time_enum  = util::time::time_enum;
using size_enum  = util::size::size_enum;
using worker_type = logger_builder::work_type;
using logger_type = logger_builder::logger_type;

inline void set_level(level_enum lv)
{
    config::instance().set_level(lv);
}
inline void set_pattern(const std::string& p)
{
    config::instance().set_pattern(p);
}
inline void set_colorful(bool color)
{
    config::instance().set_colorful(color);
}
inline void set_color(const color_mode& cols)
{
    config::instance().set_color(cols);
}
inline void set_fn_pattern(const std::string& patt)
{
    config::instance().set_fn_pattern(patt);
}
inline void set_max_file_size(size_enum size)
{
    config::instance().set_max_file_size(size);
}
inline void set_max_live_time(time_enum time)
{
    config::instance().set_max_live_time(time);
}
inline void set_max_history(size_t num)
{
    config::instance().set_max_history(num);
}
inline void set_total_size_cap(size_enum size)
{
    config::instance().set_total_size_cap(size);
}
inline void set_work_type(worker_type type)
{
    config::instance().set_work_type(type);
}
inline void set_thread_num(size_t num)
{
    config::instance().set_thread_num(num);
}
inline void set_buffer_size(size_t size)
{
    config::instance().set_buffer_size(size);
}
inline void set_buffer_increment(size_t incr)
{
    config::instance().set_buffer_incr(incr);
}
inline void set_buffer_threshold(size_t thre)
{
    config::instance().set_buffer_thres(thre);
}

}
